<?php
/**
 * Управляем "персонами" внутри сообщества.
 *
 * Есть две точки зрения на людей:
 * 1) взгляд человека на самого себя;
 * 2) взгляд сообщества на человека.
 *
 * Пока нас интересует вторая точка зрения.
 *
 * Сообщество, внутри себя, может самостоятельно формировать некий взгляд на
 * человека. Насколько такой взгляд адекватен реальному прототипу, и
 * существовал-ли в природе реальный прототип? Хм. Это интересные вопросы.
 * Вспомним анеки про Василия Ивановича: "Приходит Василий Иванович к Петьке и
 * говорит: -- Превед!" А кто такой Василий Иванович? И он действительно это
 * говорил??.. :) Однако, ЕСТЬ МНЕНИЕ, что говорил.
 *
 * Вот такое явление нас интересует. И мы будем называть его "персона".
 *
 * Персона (person) -- это устойчивое мнение о человеке.
 *
 * Интерес к перснам, прежде всего, был вызван необходимостью описать "авторов"
 * материалов. Тут не важно, реален автор или выдуман, жив или давно умер.
 * Главное, что члены сообщества его могут однозначно идентифицировать и
 * воспринимают как самостоятельное явление (например, приписывая материалы).
 *
 * Кстати, понятие "автор" мы будем рассматривать как производную характеристику
 * персоны, возникающую при появлении соответствующей связи между ней и
 * документом.
 *
 * Мы будем рассматривать множество персон как набор объектов,
 * идентифицированных сообществом. Поэтому первичный ключ персоны в этом
 * множестве будет содержать oid сообщества.
 */

/**
 * Класс Person управляет персонами внутри сообщества.
 *
 * @package Model
 * @author lucky
 */
class Model_Person extends RL_Model2
{
	public function createPerson ($community_oid, $a=array())
	{
		$person = false;

		do {
			// задано-ли сообщество?
			if (empty($community_oid)) break;

			// есть ли у юзера право создавать итемы в контексте сообщества?
			$aa = $this->mm->aa;
			$community = $this->mm->getModel('Community', 'm')->getCommunity($aa->acl_data['comity_oid']);
			$aa->getAvailableOperations($community->id);
			if	(!$aa->is_granted(array('item_create'))) {
				break;
			}

			// создадим персону.
			$a['community_oid'] = $community_oid;
			$this->fill($a);

			$person = $this->store->create('fperson', $a);

		} while (false);


		return $person;
	} // end of method createPerson
	public function getPerson ($oid)
	{
		return $this->store->getObject($oid);
	} // end of method getPerson
	public function putPerson ($person_obj)
	{
		$aa = $this->mm->aa;

		if (isset($person_obj->id)) {
			// ITEM_EDIT
			// есть ли у юзера право редактировать персону в контексте сообщества?
			$aa->getAvailableOperations($person_obj->id);
			if	(!$aa->is_granted(array('item_edit'))) {
				return false;
			}

			$this->fill($person_obj->data);
			$person_obj->save();
			$person_obj->updateSense("person");
		} else {
			// ITEM_CREATE
			// есть ли у юзера право создавать персону в контексте сообщества?
			$aa->getAvailableOperations($person_obj->data['community_oid']);
			if	(!$aa->is_granted(array('item_create'))) {
				return false;
			}

			$this->fill($person_obj->data);
			$person_obj->save();
			$person_obj->inSense("person");
			// прописывает в acl
			$aa->createItem($person_obj->id, /*parent oid*/$person_obj->data['community_oid']);
			// права для автора
			//$aa->setAcl($person_obj->id, array('item_edit' => 1, 'item_delete' => 1));
		}
		return $person_obj;
	} // end of method saveProfile
	public function fill (&$a)
	{
		/*
		if (!isset($a['wikiname'])) {
			if (isset($a['fullname'])) $a['wikiname'] = $this->string2wikiname($a['fullname']);
		}
		 */
	} // end of method autofill

	public function suggestPerson ($community_oid, $str)
	{
		$persons = array();

		$db = $this->store->db;
		$prefix = $db->db_prefix;

		$str_sql = $db->quote("$str%");
		// ищем предпологаемые объекты в class_person и class_user
		$sql = "
			(
				SELECT DISTINCT O.*, P.fullname AS fullname FROM {$prefix}objects O INNER JOIN {$prefix}class_person P ON (O.oid = P.oid AND P.community_oid = {$community_oid})
				WHERE fullname LIKE $str_sql
			) UNION DISTINCT (
				SELECT DISTINCT O.*, U.fullname AS fullname  FROM {$prefix}objects O INNER JOIN {$prefix}class_user U ON (O.oid = U.oid)
				WHERE fullname LIKE $str_sql
			)
			ORDER BY fullname
		";
		$rs = $this->store->findSQL( $sql );
		while ($person = $rs->next()) {
			$persons[] = $person;
		}

		return $persons;
	} // end of method suggestPerson
	public function string2wikiname ($str)
	{
		require_once 'translit/php/translit.php';
		$t = new Translit();
		$out = $t->Wikify($str);
		return $out;
	} // end of method title2wikiname

	public function getUser ($person_obj)
	{
		$user = NULL;
		if (isset($person_obj->data['openid_url'])) {
			$openid_url = $person_obj->data['openid_url'];
			$user = $this->mm->getModel('User', 'm')->findUserByOpenID($openid_url);
		}
		return $user;
	} // end of method getUser

	public function findPersonsByOpenID ( $openid_url )
	{
		$user_obj = NULL;
		// поиск автора
		$persons = array();
		$rs = $this->store->find('select where person.openid_url = :0', array($openid_url));
		while ($person_obj = $rs->next()) {
			if (!isset($person_obj->data['oid'])) $person_obj->data['oid'] = $user->id;
			if (!isset($person_obj->data['url'])) $person_obj->data['url'] = $this->hrefTo($person_obj);
			$persons[$person_obj->id] = $person_obj;
		}

		return $persons;
	}

	public function hrefTo ($person_obj, $params=array())
	{
		$rule = 'person_show';
		$router = $this->mm->rh->router;

		$community = $this->store->getObject($person_obj->data['community_oid']);

		$ug = new RL_URLGenerator($router->getRule($rule));
		$ug->setRouter($router);
		$params['community_url'] = $community->data['community_url'];
		$params['oid'] = $person_obj->id;
		$ug->setParams($params);
		$url = $ug->generateUrl();
		return $url;
	} // end of method hrefTo
}

?>
